/*
    模块化
        在node中一个js文件就是一个模块
        如果我们将js代码模块化可以降低js代码的耦合性
        可以让js代码服用
        js是没有模块化系统的，js引入模块的时候需要注意顺序ES5
        js标准库较少
        没有标准接口
        缺乏管理系统
        当我们程序设计达到一个规模达到一定程度，必须要模块化
    commonjs
        commonjs弥补了js没有标准的缺陷
        commonJS对模块的定义
            模块的引用                 
            模块定义
            模块标识
    模块的引用
            在node中我们通过require()函数引入外部模块，require可以传入一个参数作为路径，如果使用相对路径要以.或者..开头
            例子：
                require("./hello.js");
            当我们使用require()引入模块之后，该函数会返回一个对象，这个对象就是引入的模块
            例子：
                var md =  require("./hello.js");
            在node中每一个js代码都是独立运行在一个函数中的，其他的js文件引入模块之后，不能调用他的变量和函数
            如果我们想向外部暴露变量和方法可以通过exports，将变量或者方法设置成exports的属性
            例子：
                exports.x = "我是暴露的内容"；
                exports.fn = funcition(){

                };      
    模块标识
        我们使用require来引入模块，使用的就是模块标识，我们可以通过模块标识来找到指定的模块
        模块类型
            核心模块
                有node引擎提供的模块
                核心模块的标识就是模块的名字
                引用时直接写名字就可以，不需要写路径
            文件模块
                由用户创建的模块
                文件模块的标识就是文件的路径（相对路径，绝对路径）
                    相对路径使用.或..开头
    global
        在node中有一个全局对象global，他的作用和网页中window类似
            在全局中创建的变量都会作为global的属性保存
            在全局中创建的函数都会作为global的方法保存
    每一个js模块相当于时一个函数
        在js模块中定义的变量相当于时局部变量，我们可以使用arguments实参伪数组来查看js模块中的参数
        arguments.callee属性保存的是当前函数对象
        当我们的node执行模块的代码时，会先在代码的最上端添加如下代码
        function(exports,require,module,_filename,_dirname){
        在底部添加   
        }
        实际上我们模块中的代码都是包装在一个函数中执行，并且在函数执行时传递五个实参
            exports
                -该对象用来将变量和方法暴露到外部
            require
                -函数，用来引入外部的模块
            module
                -代表的时当前模块的自身
                -exports就是module的属性
                    module.exports == exports时一样的
            __filename
                -就是当前模块的一个完整路径
            __dirname
                -当前模块所在文件夹的一个完整路径
    module.exports和exports的区别
        module.exports可以赋值新的对象，exports不能赋值新的对象，因为使用exports来赋值新的对象话会导致，module.exports指向的对象
        和exports指向的对象不是同一个对象，exports只能通过.来向外暴露。
*/